2661. Ценники

 

В фирму “Black Label” поступили два заказа на изготовление ценников для супермаркетов. В каждом заказе указаны количество ценников и цены, которые на них должны быть напечатаны. Выведите по одному разу все цены, которые будут напечатаны на ценниках при выполнении этих двух заказов.

 

Вход. Первая строка содержит количество n (n ≤ 105) ценников для первого супермаркета. Вторая строка содержит список из n цен, которые необходимо напечатать для первого супермаркета. Третья строка содержит количество m (m ≤ 105) ценников для второго супермаркета. Четвертая строка содержит список из m цен, которые необходимо напечатать для второго супермаркета. Все входные числа целые и не превышают 109.

 

Выход.  Выведите значения, которые будут напечатаны на ценниках, при этом каждая цена должна появиться только один раз. Цены должны быть выведены в порядке возрастания.

 

Пример входа

Пример выхода

5
100 25 300 400 12000
4

10 25 25 500

10 25 100 300 400 500 12000

 

 

РЕШЕНИЕ

структуры данных – set

 

Анализ алгоритма

В задаче необходимо найти объединение двух множеств. Ее можно решить при помощи множества set или бинарного дерева. Для этого занесем значения всех ценников в выбранную структуру данных. При этом структура не должна содержать дублирующих элементов. Например, в бинарное дерево новое число вставляется только если его там еще нет. После этого нужно вывести все элементы в порядке возрастания.

 

Реализация алгоритма

Значения изготавливаемых ценников будем заносить во множество s.

 

set<int> s;

 

Читаем входные данные. Заносим n ценников для первого супермаркета во множество s.

 

scanf("%d",&n);

for(i = 0; i < n; i++)

{

  scanf("%d",&val);

  s.insert(val);

}

 

Заносим m ценников для второго супермаркета во множество s.

 

scanf("%d",&m);

for(i = 0; i < m; i++)

{

  scanf("%d",&val);

  s.insert(val);

}

 

Выводим содержимое множества s.

 

for (int x : s)

  printf("%d ", x);

printf("\n");

 

Реализация алгоритма бинарное дерево

Дерево должно содержать только разные элементы (множество ценников супермаркетов). Вставлять новое число в дерево будем только если его там нет.

 

#include <stdio.h>

 

class TreeNode

{

public:

  int val;

  TreeNode *left;

  TreeNode *right;

  TreeNode(int x) : val(x), left(NULL), right(NULL) {}

};

 

class Tree

{

public:

  TreeNode *head;

  Tree() : head(NULL) {};

 

  void Insert(int val)

  {

    Insert(head, val);

  }

 

  void Insert(TreeNode *&tree, int val)

  {

    if (tree == NULL)

    {

      tree = new TreeNode(val);

      return;

    }

 

    if (val == tree->val) return;

 

    if (val < tree->val)

      Insert(tree->left, val);

    else

      Insert(tree->right, val);

}

 

  void InOrder(void)

  {

    InOrder(head);

  }

 

  void InOrder(TreeNode *tree)

  {

    if (tree == NULL) return;

    InOrder(tree->left);

    printf("%d ", tree->val);

    InOrder(tree->right);

  }

};

 

int n, val;

 

int main(void)

{

  Tree *resTree = new Tree();

 

  scanf("%d", &n);

  while (n--)

  {

    scanf("%d", &val);

    resTree->Insert(val);

  }

 

  scanf("%d", &n);

  while (n--)

  {

    scanf("%d", &val);

    resTree->Insert(val);

  }

 

  resTree->InOrder();

  printf("\n");

  return 0;

}

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    TreeSet<Integer> s = new TreeSet<Integer>();

 

    int n = con.nextInt();

    while(n-- > 0)

    {

      int val = con.nextInt();

      s.add(val);

    }

   

    n = con.nextInt();

    while(n-- > 0)

    {

      int val = con.nextInt();

      s.add(val);

    }

   

   // Iterator iter = s.iterator();

   // for(int i = 0; i < s.size(); i++)

   //   System.out.print(iter.next() + " ");

   for(int i : s)

     System.out.print(i + " ");

   con.close();

  }

}   

 

Java реализация – бинарное дерево

 

import java.util.Scanner;

 

class TreeNode

{

  int val;

  TreeNode left;

  TreeNode right;

  TreeNode(int x)

  {

    val = x;

    left = null;

    right = null;

  }

}

 

class Tree

{

  TreeNode head;

  Tree()

  {

    head = null;

  }

 

  void Insert(int val)

  {

    head = Insert(head, val);

  }

 

  // objects are passed by copy 

  TreeNode Insert(TreeNode tree, int val)

  {

    if (tree == null)

    {

      return new TreeNode(val);

    }

   

    if (val == tree.val) return tree;

   

    if (val < tree.val)

      tree.left = Insert(tree.left, val);

    else

      tree.right = Insert(tree.right, val);

    return tree;

  }

 

  void InOrder()

  {

    InOrder(head);

  }

 

  void InOrder(TreeNode tree)

  {

    if (tree == null) return;

    InOrder(tree.left);   

    System.out.print(tree.val + " ");

    InOrder(tree.right);

  }

}

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);     

    Tree resTree = new Tree();

    int n = con.nextInt();

    for(int i = 0; i < n; i++)

    {

      int x = con.nextInt();

      resTree.Insert(x);

    }

 

    n = con.nextInt();

    for(int i = 0; i < n; i++)

    {

      int x = con.nextInt();

      resTree.Insert(x);

    }

   

    resTree.InOrder();

    System.out.println("");

 

    con.close();

  }

}

 

Python реализация

Читаем списки ценников первого и второго супермаркетов.

 

n = int(input())

lst1 = list(map(int,input().split()))

 

m = int(input())

lst2 = list(map(int,input().split()))

 

Преобразуем списки lst1 и lst2 в множества и выполним над ними операцию объединения (“or”). В результате список res содержит уникальные ценники из обоих супермаркетов в произвольном порядке.

 

res = list(set(lst1) | set(lst2))

 

Выводим ценники в порядке возрастания.

 

print(*sorted(res))

 

Python реализация – set

Значения изготавливаемых ценников будем заносить во множество s.

 

s = set()

 

Читаем n ценников для первого супермаркета и заносим их во множество s.

 

n = int(input())

lst1 = list(map(int,input().split()))

for x in lst1:

  s.add(x)

 

Читаем m ценников для второго супермаркета и заносим их во множество s.

 

m = int(input())

lst2 = list(map(int,input().split()))

for x in lst2:

  s.add(x)

 

Выводим содержимое множества s в возрастающем порядке. Множество в Python не гарантирует упорядоченность элементов, поэтому следует воспользоваться функцией sorted().

 

for x in sorted(s):

  print(x, end=' ')

print()